#include "myFunctions.h"
#include "bpNet.h"

using namespace std;

int main(int argc,char *argv[]){
	//Inicializaciones	
	bpNet Network;
	mdouble datos1a,
					datos1b,
					X;
	float **vRand,
				**targets;
	vector<int> y;
	//Cargo los datos de concent.cvs
	readFile(X,y,"concent.csv",false);
	//Creo la topologia de la red y parametros de la misma
  int neurons[] = {2,20,1},
			i,
			numPatterns = X.size(),
			maxEpocas = 1000;
  double deltaError = 0.04,
				 error; //Error local
	//Alocamos memoria para los vectores 
  vRand = (float**)calloc(numPatterns,sizeof(float*));
  targets = (float**)calloc(numPatterns,sizeof(float*));
  for (i=0; i<numPatterns ; i++){
		vRand[i] = (float*)calloc(2,sizeof(float));                    
		targets[i] = (float*)calloc(1,sizeof(float));
	}     
	//Cambio los 0 del archivo levantado por -1 que es lo que trabajamos (TANH)
	for (i=0;i<numPatterns;i++){
		vRand[i][0] = X[i][0];
		vRand[i][1] = X[i][1];
		targets[i][0] = (!y[i]) ? -1 : 1; 		 
	}
	//Inicio la red con la configuracion dada y otros params por defecto
	Network.init(neurons,3);
  Network.RandomWeights();  
	//Un K (de K-MEANS) -> Mejor si hay config
	int numPatternsK = floor(numPatterns*0.8), 
			it = numPatterns-numPatternsK,
			k=0;
	vector<float> output;
	vector<double> aux;
	//Entreno la red con los patrones de entrenamiento
	if (Network.BpTrain(vRand,targets,numPatternsK,maxEpocas,deltaError)) { 
		cout<<"Entreno"<<endl;
		output.resize(it);
		for (i = 0; i < it; i++){ //Calculo Error con los de prueba
			k = numPatternsK+i;			
			output[i] = *(Network.getOutput(vRand[k]));
			error += fabs(targets[k][0]-output[i]); 
			aux.push_back(vRand[k][0]);
			aux.push_back(vRand[k][1]);
			if(output[i]>0){
				datos1a.push_back(aux);
			}else{
				datos1b.push_back(aux);
			}
			aux.clear();//fundamental para que no guarde verduras en los archivos
		}
		cout<<"Error: "<<error/numPatterns<<endl;
		//Guardamos e imprimimos
		saveFile(datos1a,y,"concent_class_1.txt",false);
		saveFile(datos1b,y,"concent_class_2.txt",false);
		Network.printData("concent_class_1.txt", "concent_class_2.txt");
	}
	else cout<<"Falta entrenar"<< endl; 
	return 1;
}
